package com.carrot.mq.mqserver.core;

import lombok.Data;

import java.io.Serializable;
import java.util.UUID;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * @date 2023/7/31 18:53
 * 需要传递的消息
 * 属性：BasicProperties
 * 正文：byte[]
 */
@Data
public class Message implements Serializable {

    private static final long serialVersionUID = 1L;

    // 属性
    private BasicProperties basicProperties = new BasicProperties();

    // 正文
    private byte[] body;

    // Message 若持久化到文件中, 则用[offsetBeg, offsetEnd)偏移量表示范围
    private transient long offsetBeg = 0; // 消息数据的开头距离文件开头的偏移(字节)

    private transient long offsetEnd = 0; // 消息数据的结尾距离文件开头的偏移(字节)

    // 表示消息在文件中是否有效, 逻辑删除, 0x1表示有效, 0x0表示无效
    private byte isValid = 0x1;

    // 工厂方法用于封装创建 Message 对象的过程
    // 创建的 Message 对象自动生成唯一的 MessageId
    // routingKey 防止冲突, 以外部为主
    public static Message createMessageWithId(String routingKey, BasicProperties basicProperties, byte[] body) {
        Message message = new Message();
        if (basicProperties != null) {
            message.setBasicProperties(basicProperties);
        }
        message.setMessageId("M-" + UUID.randomUUID());
        message.setRoutingKey(routingKey);
        message.body = body;
        return message;
    }

    // 获取消息的Id
    public String getMessageId() {
        return basicProperties.getMessageId();
    }

    // 设置消息的Id
    public void setMessageId(String messageId) {
        basicProperties.setMessageId(messageId);
    }

    public String getRoutingKey() {
        return basicProperties.getRoutingKey();
    }

    public void setRoutingKey(String routingKey) {
        basicProperties.setRoutingKey(routingKey);
    }

    // 是否持久化
    public int getDeliverMode() {
        return basicProperties.getDeliverMode();
    }

    public void setDeliverMode(int mode) {
        basicProperties.setDeliverMode(mode);
    }
}
